---
title: StageManager 舞台管理器
icon: LayoutGrid
relatedFile: app/src/core/stage/stageManager/StageManager.tsx
---

这个服务作为项目的核心组件，负责对“舞台”或画布上的所有视觉元素（包括各种实体和关联）进行集中管理。它提供了全面的功能，用于查询、操作和维护这些元素及其之间的关系。

## 主要功能

*   **实体与关联管理**: 负责舞台上所有节点（如文本、图片、区域、连接点等）和关联（如边、多目标无向边）的存储、检索和生命周期管理。
*   **空间查询与定位**: 提供基于位置查找舞台元素的能力，支持根据坐标点查找特定类型的实体或关联，以及计算舞台上所有元素的中心点和整体尺寸。
*   **选择状态管理**: 维护舞台元素的选中状态，并提供全选、清除选择以及获取当前选中元素列表的功能。
*   **结构与关系操作**:
    *   **连接与断开**: 支持在不同实体之间建立连接，包括直线边和曲线边，并能处理多实体连接。
    *   **引用更新**: 自动更新实体和关联之间的引用关系，确保数据一致性，并处理区域（Section）的子元素更新和边的偏移状态。
    *   **删除**: 提供删除单个或多个实体及关联的功能，包括通过选择状态进行批量删除。
    *   **方向反转**: 能够反转节点或选中边的连接方向。
*   **内容生成与导入**: 支持从序列化数据、文本或 Markdown 内容生成节点树或图结构并添加到舞台。
*   **区域（Section）操作**: 提供将实体打包成区域、实体进出区域、以及区域的折叠与展开等高级管理功能。
*   **标签管理**: 协助管理舞台元素的标签，包括刷新标签UI和根据标签移动相机视角。
*   **显示与刷新**: 能够刷新舞台上所有或部分（选中）元素的显示状态，例如调整文本节点大小或刷新图片节点。
*   **连线样式转换**: 支持在不同类型的连线（如直线边、曲线边、有向边、无向边）之间进行转换。
*   **曲线边（CR Edge）控制**: 提供对曲线边控制点和张力进行调整的功能。

## API 方法

### `get(uuid: string)`

根据唯一标识符（UUID）获取舞台上的对象。

### `isEmpty(): boolean`

判断舞台上是否存在任何对象。

### `getTextNodes(): TextNode[]`

获取舞台上所有的文本节点。

### `getConnectableEntity(): ConnectableEntity[]`

获取舞台上所有可连接的实体。

### `isEntityExists(uuid: string): boolean`

检查指定UUID的实体是否存在于舞台上。

### `getSections(): Section[]`

获取舞台上所有的区域（Section）节点。

### `getImageNodes(): ImageNode[]`

获取舞台上所有的图片节点。

### `getConnectPoints(): ConnectPoint[]`

获取舞台上所有的连接点。

### `getUrlNodes(): UrlNode[]`

获取舞台上所有的URL节点。

### `getPortalNodes(): PortalNode[]`

获取舞台上所有的传送门节点。

### `getPenStrokes(): PenStroke[]`

获取舞台上所有的涂鸦笔画。

### `getSvgNodes(): SvgNode[]`

获取舞台上所有的SVG节点。

### `getStageObjects(): StageObject[]`

获取舞台上所有类型的对象。

### `getEntities(): Entity[]`

获取舞台上所有类型的实体。

### `getEntitiesByUUIDs(uuids: string[]): Entity[]`

根据UUID列表获取对应的实体。

### `isNoEntity(): boolean`

判断舞台上是否没有任何实体。

### `delete(stageObject: StageObject)`

从舞台中删除指定的对象。

### `getAssociations(): Association[]`

获取舞台上所有的关联对象（如边）。

### `getEdges(): Edge[]`

获取舞台上所有的边。

### `getLineEdges(): LineEdge[]`

获取舞台上所有的直线边。

### `getCrEdges(): CubicCatmullRomSplineEdge[]`

获取舞台上所有的三次Catmull-Rom样条曲线边。

### `add(stageObject: StageObject)`

向舞台中添加一个对象。

### `updateReferences()`

更新舞台上实体和关联之间的引用关系，并处理区域和边的状态。

### `getTextNodeByUUID(uuid: string): TextNode | null`

根据UUID获取文本节点。

### `getConnectableEntityByUUID(uuid: string): ConnectableEntity | null`

根据UUID获取可连接实体。

### `isSectionByUUID(uuid: string): boolean`

判断指定UUID的对象是否为区域（Section）。

### `getSectionByUUID(uuid: string): Section | null`

根据UUID获取区域（Section）节点。

### `getCenter(): Vector`

计算舞台上所有对象的中心点。

### `getSize(): Vector`

计算舞台上所有对象的总尺寸。

### `getBoundingRectangle(): Rectangle`

获取包含舞台上所有对象的最小矩形区域。

### `findTextNodeByLocation(location: Vector): TextNode | null`

根据位置查找文本节点。

### `findLineEdgeByLocation(location: Vector): LineEdge | null`

根据位置查找直线边。

### `findAssociationByLocation(location: Vector): Association | null`

根据位置查找关联对象。

### `findSectionByLocation(location: Vector): Section | null`

根据位置查找区域（Section）节点。

### `findImageNodeByLocation(location: Vector): ImageNode | null`

根据位置查找图片节点。

### `findConnectableEntityByLocation(location: Vector): ConnectableEntity | null`

根据位置查找可连接实体。

### `findEntityByLocation(location: Vector): Entity | null`

根据位置查找实体，优先返回涂鸦笔画。

### `findConnectPointByLocation(location: Vector): ConnectPoint | null`

根据位置查找连接点。

### `isHaveEntitySelected(): boolean`

判断舞台上是否有实体被选中。

### `getSelectedEntities(): Entity[]`

获取所有被选中的实体。

### `getSelectedAssociations(): Association[]`

获取所有被选中的关联对象。

### `getSelectedStageObjects(): StageObject[]`

获取所有被选中的舞台对象（实体和关联）。

### `isEntityOnLocation(location: Vector): boolean`

判断指定位置是否有实体存在（排除被折叠的实体）。

### `isAssociationOnLocation(location: Vector): boolean`

判断指定位置是否有关联对象存在。

### `deleteEntities(deleteNodes: Entity[])`

删除指定的实体列表。

### `deleteSelectedStageObjects()`

删除所有被选中的舞台对象。

### `deleteAssociation(deleteAssociation: Association): boolean`

删除指定的关联对象。

### `deleteEdge(deleteEdge: Edge): boolean`

删除指定的边。

### `connectEntity(fromNode: ConnectableEntity, toNode: ConnectableEntity, isCrEdge: boolean = false)`

连接两个可连接实体，可选择创建直线边或曲线边。

### `connectMultipleEntities(fromNodes: ConnectableEntity[], toNode: ConnectableEntity, isCrEdge: boolean = false, sourceRectRate?: [number, number], targetRectRate?: [number, number])`

连接多个实体到同一个目标实体。

### `reverseSelectedNodeEdge()`

反转所有选中节点所连接的边的方向。

### `reverseSelectedEdges()`

反转所有选中边的方向。

### `addSerializedData(serializedData: Serialized.File, diffLocation = new Vector(0, 0))`

向舞台添加序列化数据。

### `generateNodeTreeByText(text: string, indention: number = 4, location = this.project.camera.location)`

根据文本内容生成节点树。

### `generateNodeGraphByText(text: string, location = this.project.camera.location)`

根据文本内容生成节点图。

### `generateNodeByMarkdown(text: string, location = this.project.camera.location)`

根据Markdown内容生成节点。

### `packEntityToSection(addEntities: Entity[])`

将多个实体打包成一个区域（Section）。

### `packEntityToSectionBySelected()`

将所有选中的实体打包成一个区域（Section）。

### `goInSection(entities: Entity[], section: Section)`

将实体移动到指定的区域（Section）内部。

### `goOutSection(entities: Entity[], section: Section)`

将实体从指定的区域（Section）移出。

### `packSelectedSection()`

折叠所有选中的区域（Section）。

### `unpackSelectedSection()`

展开所有选中的区域（Section）。

### `sectionSwitchCollapse()`

切换选中区域（Section）的折叠状态。

### `addTagBySelected()`

为选中的实体添加标签。

### `refreshTags()`

刷新标签UI。

### `moveCameraToTag(tag: string)`

将相机移动到指定标签所在的位置。

### `connectEntityByCrEdge(fromNode: ConnectableEntity, toNode: ConnectableEntity)`

使用曲线边连接两个可连接实体。

### `refreshAllStageObjects()`

刷新舞台上所有对象的显示状态。

### `refreshSelected()`

刷新所有选中对象的显示状态。

### `changeSelectedEdgeConnectLocation(direction: Direction | null, isSource: boolean = false)`

改变选中边的连接点位置。

### `changeEdgesConnectLocation(edges: Edge[], direction: Direction | null, isSource: boolean = false)`

改变多条边的连接点位置。

### `switchLineEdgeToCrEdge()`

将选中的直线边转换为曲线边。

### `switchEdgeToUndirectedEdge()`

将选中的有向边转换为无向边。

### `switchUndirectedEdgeToEdge()`

将选中的无向边转换为有向边。

### `addSelectedCREdgeControlPoint()`

为选中的曲线边添加控制点。

### `addSelectedCREdgeTension()`

增加选中曲线边的张力。

### `reduceSelectedCREdgeTension()`

减少选中曲线边的张力。

### `selectAll()`

全选舞台上所有对象。

### `clearSelectAll()`

清除所有对象的选中状态。
